Skip to content

build: build the executables with Python 3.14 - #515

Merged
Guts merged 4 commits into
masterfrom
packaging/executables-python-3.14
Oct 18, 2026
Merged

Guts merged 4 commits into
masterfrom
packaging/executables-python-3.14

Conversation

@Guts

@Guts Guts commented Oct 18, 2026 •

Copy link
Copy Markdown
Owner

Stacked on #514 (base packaging/drop-python-3.10). The build workflow only runs on pull requests targeting master, so it will run once GitHub retargets this PR, after #514 is merged: that run is the real validation of the executables.

Description

Builds the Linux and Windows executables with Python 3.14 instead of 3.11. Set once, in the workflow's global PYTHON_VERSION: the Windows job no longer overrides it.

GDAL on Windows

GDAL comes from a cgohlke/geospatial-wheels wheel, previously hardcoded (GDAL 3.11.1, cp311, release v2025.7.4). That release does contain a cp314 wheel, but it was built on 4 July 2025, against a Python 3.14 pre-release, before the ABI was frozen at 3.14.0rc1. This PR uses v2025.10.25, the first release built after Python 3.14.0 final, with GDAL 3.11.4: same minor version as the Linux build (3.11.*).

The wheel URL is now built from GDAL_VERSION, GEOSPATIAL_WHEELS_RELEASE and PYTHON_VERSION (the way tester.yml already does); the resulting URL was checked to resolve.

Checked beforehand

  • PyInstaller allows Python 3.14 from 6.15.0 on (requires_python of earlier releases stops at <3.14); the current range >=6.8.0,<6.23 resolves to 6.22.3 there, so no pin change.
  • Compiled runtime dependencies — PyQt6, PyQt6-Qt6, PyQt6-sip, lxml, numpy, charset-normalizer — all publish cp314 or abi3 wheels for Windows and Linux x86_64: no build from source during packaging.
  • Linux GDAL bindings are built from source against the system libgdal, as the Ubuntu 3.14 test job already does successfully.

Windows tests aligned

The Windows test matrix used the v2025.7.4 wheels (GDAL 3.11.1) and stopped at 3.13. It now uses the same release and GDAL version as the builder (v2025.10.25, GDAL 3.11.4, set through the same GEOSPATIAL_WHEELS_RELEASE/GDAL_VERSION env variables, with a note in both workflows to keep them in sync) and runs on 3.11 to 3.14, like Ubuntu: the Python version shipped in the Windows executable is now unit-tested on Windows. The example wheel name in docs/development/windows.md follows.

Related issue(s)

Follows #514.

Type of change

  • Bug fix (fix/… branch)
  • New feature or enhancement (feature/… branch)
  • Documentation (docs/… branch or *.md/docs/** changes)
  • Packaging / build (packaging/… branch or builder/** changes)
  • Tooling / CI-CD (tooling/… branch or .github/** changes)
  • Tests only (tests/** changes)

Checklist

  • I have read the Contributing Guidelines
  • pre-commit run --all-files passes locally (on the branch's changes; workflow YAML validated, pre-commit.ci runs on the PR)
  • I have added or updated tests covering my changes (workflow change, validated by the build job itself)
  • I have updated the documentation where relevant (nothing documents the build's Python version)
  • pytest passes locally (no code change)

AI/LLM disclosure

https://claude.ai/code/session_01Dwmm8jY9WWvgUJt9WQ7QWZ


Generated by Claude Code

The Linux and Windows executables embedded Python 3.11. Build both with Python 3.14, set once in the workflow's global PYTHON_VERSION; the Windows job no longer overrides it.

On Windows, GDAL comes from a cgohlke/geospatial-wheels wheel, previously hardcoded for GDAL 3.11.1 and cp311 from release v2025.7.4. That release does have a cp314 wheel, but built on 4 July 2025, against a Python 3.14 pre-release, before its ABI was frozen at 3.14.0rc1. Use release v2025.10.25 instead, the first one built after Python 3.14.0 final, with GDAL 3.11.4: same minor version as the Linux build (3.11.*). The wheel URL is now built from GDAL_VERSION, GEOSPATIAL_WHEELS_RELEASE and PYTHON_VERSION; checked to resolve.

Checked beforehand: PyInstaller allows Python 3.14 from 6.15.0 on (the current range resolves to 6.22.3), and every compiled runtime dependency (PyQt6, PyQt6-Qt6, PyQt6-sip, lxml, numpy, charset-normalizer) publishes cp314 or abi3 wheels for Windows and Linux. On Linux, the GDAL bindings are built from source against the system libgdal, as the Ubuntu 3.14 test job already does.

AI-Level: 7 (human specced, bots coded)
AI-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dwmm8jY9WWvgUJt9WQ7QWZ
@github-actions github-actions Bot added ci-cd Everything related to continuous integration and deployment packaging labels Oct 18, 2026
…cluded

The Windows test matrix used the v2025.7.4 geospatial-wheels release
(GDAL 3.11.1), whose cp314 wheel targets a Python 3.14 pre-release, so it
stopped at 3.13 while the executables now ship Python 3.14. Use the same
release as the builder (v2025.10.25, GDAL 3.11.4) and add 3.14 to the
matrix, with a note in both workflows to keep them aligned.

AI-Level: 7
AI-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dwmm8jY9WWvgUJt9WQ7QWZ
AI-Level: 7
AI-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dwmm8jY9WWvgUJt9WQ7QWZ
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Oct 18, 2026
Base automatically changed from packaging/drop-python-3.10 to master October 18, 2026 11:27
@sonarqubecloud

Copy link
Copy Markdown

@Guts
Guts enabled auto-merge October 18, 2026 11:29
@codecov

codecov Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 78.11%. Comparing base (6128112) to head (d3dd616).
⚠️ Report is 5 commits behind head on master.

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##           master     #515   +/-   ##
=======================================
  Coverage   78.11%   78.11%           
=======================================
  Files          55       55           
  Lines        3473     3473           
  Branches      424      424           
=======================================
  Hits         2713     2713           
  Misses        639      639           
  Partials      121      121           
Flag Coverage Δ
unittests 78.05% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@Guts
Guts merged commit ec7e96f into master Oct 18, 2026
19 checks passed
@Guts
Guts deleted the packaging/executables-python-3.14 branch October 18, 2026 11:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci-cd Everything related to continuous integration and deployment documentation Improvements or additions to documentation packaging

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants